var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
 
var compression = require('compression');
var helmet = require('helmet');
const cors = require('cors');

// 引入数据库连接
require('./db/index');

var indexRouter = require("./routes/index");
var sowRouter = require("./routes/sow");
var AiRouter = require("./routes/AI");
var usersRouter = require("./routes/users"); 
var { router: lhxRouter } = require("./routes/lhx_routes"); 
// var lhxRouter = require("./routes/lhx");

const app = express();

// CORS配置
app.use(cors({
  origin: '*',  // 在生产环境中建议设置具体的域名
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

// 安全和性能中间件 - 放在最前面
app.use(helmet({
  contentSecurityPolicy: false, // 暂时禁用CSP，避免影响现有功能
  crossOriginEmbedderPolicy: false
}));

// 启用gzip压缩 - 对所有响应进行压缩
app.use(compression({
  filter: (req, res) => {
    // 不压缩已经压缩的内容
    if (req.headers['x-no-compression']) {
      return false;
    }
    // 使用compression的默认过滤器
    return compression.filter(req, res);
  },
  level: 6, // 压缩级别 (1-9, 6是默认值，平衡压缩率和速度)
  threshold: 1024 // 只压缩大于1KB的响应
}));
 

// view engine setup
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "jade");

app.use(logger("dev"));
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: false, limit: '10mb' }));
app.use(cookieParser());

// 静态资源优化配置
app.use(express.static(path.join(__dirname, 'public'), {
  maxAge: process.env.NODE_ENV === 'production' ? '1y' : '0', // 生产环境缓存1年，开发环境不缓存
  etag: true, // 启用ETag
  lastModified: true, // 启用Last-Modified
  setHeaders: (res, path) => {
    // 为不同类型的文件设置不同的缓存策略
    if (path.endsWith('.css') || path.endsWith('.js')) {
      res.setHeader('Cache-Control', 'public, max-age=31536000'); // CSS/JS文件缓存1年
    } else if (path.match(/\.(jpg|jpeg|png|gif|ico|svg)$/)) {
      res.setHeader('Cache-Control', 'public, max-age=2592000'); // 图片文件缓存30天
    }
  }
}));

app.use("/users", usersRouter);
app.use("/sow", sowRouter);
app.use("/AI", AiRouter);
app.use("/lhx", lhxRouter);
app.use("/", indexRouter);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
  console.error('全局错误处理:', err);
  
  // 如果是API请求，返回JSON错误
  if (req.path.startsWith('/sow') || req.path.startsWith('/users') || req.path.startsWith('/AI') || req.path.startsWith('/lhx')) {
    return res.status(err.status || 500).json({
      success: false,
      message: err.message || '服务器内部错误',
      error: req.app.get("env") === "development" ? err.stack : {}
    });
  }
  
  // 其他请求渲染错误页面
  res.locals.message = err.message;
  res.locals.error = req.app.get("env") === "development" ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render("error");
});

module.exports = app;
